Code
knitr::include_graphics("Thesis_CF_FinalDaw.png")April-May 2025 Progress Review
The rapid digitalization of financial services has opened up new opportunities for the adoption of emerging technologies like cryptocurrency in the Philippines. Cryptocurrency, with its potential for decentralized, fast, and borderless transactions, has garnered significant attention as a transformative force in the Philippinesβ financial landscape (Santos & Cruz, 2023). However, widespread adoption remains hindered by concerns surrounding security, usability, and the perceived value of these virtual currencies (Garcia et al., 2024).
This research employs the Integrated Technology Readiness and Acceptance Model (TRAM) framework (Parasuraman & Colby, 2015) to evaluate cryptocurrency adoption intentions in the Philippine context. The study examines four key technology readiness dimensions identified by Lin and Chang (2020): optimism, innovativeness, insecurity, and discomfort. These dimensions are analyzed in relation to two critical factors from the Technology Acceptance Model (Davis, 1989): perceived ease of use and perceived usefulness.
To analyze the factors influencing the adoption of cryptocurrency among students of Visayas State University using an integrated approach that combines the Technology Readiness Index (TRI) and the Technology Acceptance Model (TAM).
To describe the socio-demographics of Visayas State University students and in relation to their adoption of cryptocurrrency;
To analyze the interrelationships between inherent technology readiness, technology acceptance, and perceived risk in the context of virtual currency adoption; and
To contribute to policy development by providing insights on the determinants of cryptocurrency adoption.
As shown in Figure 1, it integrates the Technology Readiness Index (TRI) and the Technology Acceptance Model (TAM) as a whole Technology Readiness and Acceptance Model (TRAM). This integrated approach combines the rational, performance-oriented perspective of TAM with the psychological readiness dimensions of TRI, added with the variable of perceived risk, offering a comprehensive model for understanding technology adoption.
knitr::include_graphics("Thesis_CF_FinalDaw.png")The framework integrates Technology Readiness Index (TRI) dimensions, which represent individualsβ psychological predispositions toward technology. These dimensions include Optimism (OPT), Innovativeness (INN), Insecurity (INS), and Discomfort (DIS), which are theorized to influence key Technology Acceptance Model (TAM) constructs like Perceived Ease of Use (PEU) and Perceived Usefulness (PUN) (Parasuraman & Colby, 2015), added with Perceived Risk (PER), and its dependent variable - Behavior Intention to Use (BIU).
To fulfill the objectives of this study, the Technology Readiness and Acceptance Model (TRAM) employed a quantitative, cross-sectional research design to investigate the factors influencing cryptocurrency adoption intentions among VSU students. A quantitative methodology was adopted, aligned with past research efforts applying TRAM (Godoe, et al., 2012, Simiyu, 2019). This quantitative approach enabled data collection and analysis through a structured closed-ended survey instrument. As emphasized by Cohen et al.Β (2007), quantitative techniques allow findings from a sample population to be statistically generalized to the wider population. Furthermore, the cross-sectional design provided a snapshot of perceptions and intentions at a specific point in time, enabling efficient data collection while minimizing participant burden. Thus, a quantitative methodology guided by TRAM allows research questions on technology adoption intentions to be reliably measured and projected based on findings from the survey sample.
The target population for this study comprised undergraduate students enrolled at Visayas State University during the school year 2024-2025. This population was selected due to their demographic profile aligning with early technology adopters and their potential future role in cryptocurrency market development (Kim et al., 2021).
A simple random sampling technique was employed to ensure every student in the target population had an equal and independent chance of being selected for the study. This technique involved generating a complete sampling frame of all enrolled students from the university registry, assigning each student a unique identifier, and using a computer-generated random number algorithm to select participants. This approach eliminated selection bias, enhanced the external validity of findings, and provided a statistically representative sample of the student population (Taherdoost, 2016). Additionally, simple random sampling was specifically chosen because cryptocurrency adoption is a phenomenon that transcends traditional demographic boundaries, and this sampling method allows for the natural emergence of patterns without imposing predetermined stratification that might inadvertently introduce researcher bias about which population segments are most relevant to cryptocurrency adoption (Fowler, 2014).
A sampling using Cochranβs formula was used to recruit undergraduate students from Visayas State University - Main Campus. The current undergraduate university student population of school year 2024-2025 is 9,846. Using 90% confidence with a 5% margin of error, the recommended sample size is 264 based on Cochranβs formula. Thus, at least 264 student participants from Visayas State University were randomly sampled and surveyed.
The TRAM survey instrument consisted of seven (7) closed-ended questions of the Pre-Screening Test portion, and forty-eight (48) closed-ended items combining validated scales from both the Technology Readiness Index (TRI) and the Technology Acceptance Model (TAM).
Sociodemographic information collected included age, sex, faculty, year level, and income sources. Technology usage and digital competency measures assessed internet usage habits, digital competency, and familiarity with digital financial tools. Cryptocurrency awareness and experience items captured knowledge of cryptocurrencies, ownership status, and usage patterns. The Technology Readiness Index (TRI), adapted from Parasuraman and Colby (2015), measured optimism, innovativeness, discomfort, and insecurity dimensions. Technology acceptance measures, adapted from Davis (1989) and Venkatesh et al.Β (2003), captured perceived usefulness and perceived ease of use. Perceived risk items, adapted from Featherman and Pavlou (2003), measured financial, performance, and security risk perceptions. Finally, behavioral intention to use items, adapted from Venkatesh et al.Β (2003), assessed respondentsβ intentions to adopt cryptocurrency in the near future.
The questionnaire comprised seven (7) parts β the first being the Consent letter, the second being the Sociodemographic Profile, and the third being the Pre-Screening Test. Then, it is followed by twenty-four (24) measurement statements of TRI scored on a 5-point Likert agreement scale (1-Strongly Disagree to 5-Strongly Agree), and twelve (12) measurement scales of TAM scored on a 7-point Likert agreement scale (1-Strongly Unlikely to 5-Strongly Likely). Then, with six (6) measurement scales of Perceived Risk. Lastly, it ended with six (6) measurement statements of behavioral intention to use still on a 7-point Likert agreement scale.
The core TRAM items included 24 statements from TRI encompassing the readiness dimensions of optimism (6 items), innovativeness (6 items), insecurity (6 items), and discomfort (6 items). Additionally, 24 statements were adapted from Davis (1989) and edited for the TAM constructs of perceived ease of use (6 items), perceived usefulness (6 items), perceived risk (6 items), and behavioral intention to use (6 items).
To ensure the validity and reliability of the research instrument, several procedures were implemented.
Content validity using Congruence Test was established through review by a panel of two subject matter experts, both from the Faculty of Management and Economics, who assessed the relevance, clarity, and comprehensiveness of the items.
Face validity was addressed through a pilot test with twenty (20) students who matched the target population criteria. Feedback was collected regarding question clarity, questionnaire flow, and completion time. Based on expert reviews and pilot test feedback, the questionnaire was refined by adjusting the length to ensure completion within 15-20 minutes.
Final data collection were gathered for 17 days, from March 24, 2025, to April 10, 2025, using the survey questionnaire online. Of the 264 needed respondents, 500 students were distributed with the survey questionnaire on their emails to ensure a robust, usable sample. And instead of just 264, the researcher collected 277 responses from the random respondents.
The data collection process ensured comprehensive coverage and reliable data acquisition. Research ethics approval was obtained from the VSU University Ethics Committee prior to commencing data collection. Potential respondents were recruited through requesting data from the schoolβs registrar of the official university email of the students. The questionnaire was primarily administered online using Google Forms to maximize reach and facilitate data management. The survey remained active for seventeen (17) days, from March 24, 2025, to April 10, 2025.
(on manuscript)
Descriptive statistics were computed to characterize the sample and summarize response patterns. The analysis included frequency distributions with counts and percentages for categorical variables, measures of mean for continuous variable (age), and visual representations to illustrate response distributions.
EFA was conducted to examine the underlying structure of the measurement items. Factorability assessment employed Bartlettβs test of sphericity and Kaiser-Meyer-Olkin (KMO) measure of sampling adequacy to determine the suitability of the data for factor analysis. Principal axis factoring with verimax rotation was utilized for factor extraction, accommodating the anticipated correlation between factors. Factor retention decisions relied on multiple criteria, including Kaiserβs criterion (eigenvalues > 1.0), scree plot examination, parallel analysis, and theoretical coherence. Items with low factor loadings (< 0.50) or high cross-loadings (> 0.40 on multiple factors) were evaluated for potential elimination to refine the instrument.
CFA was performed to validate the measurement model. The factor structure identified in the EFA was specified as a measurement model in lavaan. Model estimation utilized maximum likelihood estimation, with robust corrections for non-normality applied where necessary. The model fit was evaluated using multiple indices, including Chi-square test (ΟΒ²/df < 3.0), Comparative Fit Index (CFI > 0.95), Tucker-Lewis Index (TLI > 0.95), Root Mean Square Error of Approximation (RMSEA < 0.06), and Standardized Root Mean Square Residual (SRMR < 0.08). Modification indices were examined for potential improvements, with changes implemented only when theoretically justifiable.
PLS-SEM was employed as the primary analytical technique for hypothesis testing.
Measurement model assessment focused on item reliability (standardized indicator loadings > 0.70), internal consistency (composite reliability > 0.70), convergent validity (average variance extracted > 0.50), and discriminant validity (Fornell-Larcker criterion and heterotrait-monotrait ratio).
Structural model assessment examined path coefficients (direction, magnitude, and statistical significance), coefficient of determination (RΒ²) to evaluate explanatory power, effect size (fΒ²) to assess impact of exogenous constructs, Stone-Geisserβs QΒ² to determine predictive relevance, and variance inflation factor (VIF < 5.0) to check for multicollinearity.
Significance testing utilized bootstrapping procedure with 5,000 resamples, two-tailed testing at Ξ± = 0.05, and 95% confidence intervals for path coefficients. Mediation analysis assessed direct and indirect effects, classified mediation types (full, partial, or none), and tested significance of indirect effects through bootstrapping.
All analyses were conducted using R (version 4.1.2) and its specialized packages.
Data preparation and cleaning utilized tidyverse and naniar packages. Exploratory analysis employed psych and FactoMineR packages. Confirmatory factor analysis was conducted with lavaan. PLS-SEM analyses were performed using plspm and semPLS packages. Visualization of results utilized ggplot2, corrplot, and semPlot packages.
This software ecosystem allowed for reproducible, transparent, and comprehensive data analysis while providing flexibility for advanced statistical modeling.
knitr::include_graphics("pls-sem.drawio.png")Figure 2. Proposed structural equation model of the Technology Readiness and Acceptance Model (TRAM) in Analyzing to Adopt Cryptocurrency
The actual data collection commenced on March 24, 2025. As of April 10, 2025, the data collection finished with a total of 277 respondents had participated in the study out of the 264 required.
# Load libraries
library(readxl) # For reading Excel files
library(dplyr) # For data manipulation
library(psych) # For descriptive statistics
library(tidyverse) # For data wrangling
library(ggplot2)
library(janitor)
library(summarytools)
library(kableExtra)
library(knitr)
library(plspm)
library(melt)
library(reshape2)
library(EFAtools)
library(seminr)
library(gtsummary)
library(scales)
library(forcats)
library(gridExtra)
library(cowplot)
library(seminr)
# Import data
df_final <- read_excel("~/Thesis!/Thesis-Updates/Final_Responses.xlsx", sheet = 2) |>
clean_names()
# data
DT::datatable(df_final)The sociodemographic profile of the study participants was examined to provide context for subsequent analyses. Table 4.1 presents the distribution of respondents by sex and overall sample characteristics, including age, faculty affiliation, main income source, secondary income source, and year level.
Table 4.1. Sociodemographic Characteristics of Respondents by Sex and Overall
# Categorical Variables by Sex and Overall
# ---- Step 1: Define variables and labels ----
categorical_variables <- c("year_level", "faculty", "main_income", "sec_income")
continuous_variables <- c("age")
variable_labels <- c(
year_level = "Year Level",
faculty = "Faculty",
main_income = "Main Income Source",
sec_income = "Secondary Income Source",
age = "Age"
)
# ---- Step 2: Count total per sex for table headers ----
sex_counts <- df_final %>%
count(sex) %>%
pivot_wider(names_from = sex, values_from = n)
# Fallback in case some sex levels are missing
get_count <- function(sex_label) {
if (sex_label %in% names(sex_counts)) {
return(sex_counts[[sex_label]])
} else {
return(0)
}
}
female_n <- get_count("Female")
male_n <- get_count("Male")
pnts_n <- get_count("Prefer not to say")
total_n <- nrow(df_final)
# ---- Step 3: Functions to generate summaries ----
generate_summary <- function(data, variable) {
data %>%
mutate(!!variable := as.character(.data[[variable]])) %>%
group_by(Variable = variable, Category = .data[[variable]], sex) %>%
summarise(n = n(), .groups = "drop") %>%
group_by(Variable, Category) %>%
mutate(pct = round(100 * n / sum(n), 1),
Summary = paste0(n, " (", pct, "%)")) %>%
select(-n, -pct) %>%
pivot_wider(names_from = sex, values_from = Summary) %>%
ungroup()
}
generate_overall <- function(data, variable) {
data %>%
mutate(!!variable := as.character(.data[[variable]])) %>%
group_by(Variable = variable, Category = .data[[variable]]) %>%
summarise(n = n(), .groups = "drop") %>%
mutate(pct = round(100 * n / sum(n), 1),
Overall = paste0(n, " (", pct, "%)")) %>%
select(-n, -pct)
}
generate_continuous_summary <- function(data, variable) {
data %>%
group_by(sex) %>%
summarise(
Mean = mean(.data[[variable]], na.rm = TRUE),
SD = sd(.data[[variable]], na.rm = TRUE),
.groups = "drop"
) %>%
mutate(Summary = paste0(round(Mean, 1), " (", round(SD, 1), ")")) %>%
select(sex, Summary) %>%
pivot_wider(names_from = sex, values_from = Summary)
}
generate_continuous_overall <- function(data, variable) {
data %>%
summarise(
Mean = mean(.data[[variable]], na.rm = TRUE),
SD = sd(.data[[variable]], na.rm = TRUE)
) %>%
mutate(Overall = paste0(round(Mean, 1), " (", round(SD, 1), ")")) %>%
select(Overall)
}
# ---- Step 4: Bind all variable summaries ----
continuous_table <- bind_rows(
lapply(continuous_variables, function(var) {
overall <- generate_continuous_overall(df_final, var)
by_sex <- generate_continuous_summary(df_final, var)
df <- bind_cols(tibble(Variable = var, Category = "Mean (SD)"), overall, by_sex)
return(df)
})
)
categorical_table_final <- bind_rows(
continuous_table,
lapply(categorical_variables, function(var) {
sex_table <- generate_summary(df_final, var)
overall_table <- generate_overall(df_final, var)
full_join(overall_table, sex_table, by = c("Variable", "Category"))
})
)
# ---- Step 4.5: Sort categories by Overall count (descending) ----
categorical_table_final <- categorical_table_final %>%
mutate(Variable = recode(Variable, !!!variable_labels))
# Extract numeric count from "Overall" column for sorting
extract_count <- function(x) as.numeric(sub(" .*", "", x))
categorical_table_final <- categorical_table_final %>%
mutate(count_sort = extract_count(Overall)) %>%
group_by(Variable) %>%
arrange(desc(count_sort), .by_group = TRUE) %>%
ungroup() %>%
select(-count_sort)
# ---- Step 5: Format table with variable labels, bold headers, and indenting ----
categorical_table_final <- categorical_table_final %>%
arrange(Variable) %>%
group_by(Variable) %>%
mutate(
row_id = row_number(),
Display = paste0(" ", Category),
Overall = paste0("<b>", Overall, "</b>")
) %>%
ungroup()
# Create header rows per variable
variable_headers <- categorical_table_final %>%
group_by(Variable) %>%
slice(1) %>%
mutate(
Display = paste0("<b>", Variable, "</b>"),
Overall = "", Female = "", Male = "", `Prefer not to say` = ""
) %>%
ungroup()
# Bind and arrange
categorical_table_final <- bind_rows(variable_headers, categorical_table_final) %>%
arrange(Variable, row_id) %>%
select(Display, Overall, Female, Male, `Prefer not to say`)
# ---- Step 6: Clean column names with N counts ----
colnames(categorical_table_final) <- c(
"Variable",
paste0("Overall (N = ", total_n, ")"),
paste0("Female (N = ", female_n, ")"),
paste0("Male (N = ", male_n, ")"),
paste0("Prefer Not to Say (N = ", pnts_n, ")")
)
# ---- Step 7: Display table ----
kable(categorical_table_final, "html", escape = FALSE,
caption = "Categorical Variables by Sex and Overall") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
column_spec(1, extra_css = "text-align: left;") %>%
column_spec(2:5, extra_css = "text-align: center;") %>%
row_spec(0, bold = TRUE)| Variable | Overall (N = 277) | Female (N = 163) | Male (N = 101) | Prefer Not to Say (N = 13) |
|---|---|---|---|---|
| Age | ||||
| Β Β Β Β Mean (SD) | 21.3 (2.3) | 21.2 (2.2) | 21.6 (2.4) | 19.8 (1.8) |
| Faculty | ||||
| Β Β Β Β Faculty of Management and Economics | 62 (22.4%) | 37 (59.7%) | 20 (32.3%) | 5 (8.1%) |
| Β Β Β Β Faculty of Agriculture and Food Sciences | 58 (20.9%) | 31 (53.4%) | 24 (41.4%) | 3 (5.2%) |
| Β Β Β Β Faculty of Natural and Mathematical Sciences | 37 (13.4%) | 25 (67.6%) | 12 (32.4%) | NA |
| Β Β Β Β Faculty of Engineering | 34 (12.3%) | 18 (52.9%) | 15 (44.1%) | 1 (2.9%) |
| Β Β Β Β Faculty of Teacher Education | 27 (9.7%) | 17 (63%) | 7 (25.9%) | 3 (11.1%) |
| Β Β Β Β Faculty of Nursing | 17 (6.1%) | 11 (64.7%) | 6 (35.3%) | NA |
| Β Β Β Β Faculty of Forestry and Environmental Science | 14 (5.1%) | 8 (57.1%) | 6 (42.9%) | NA |
| Β Β Β Β Faculty of Humanities and Social Sciences | 12 (4.3%) | 7 (58.3%) | 4 (33.3%) | 1 (8.3%) |
| Β Β Β Β Faculty of Veterinary Medicine | 10 (3.6%) | 8 (80%) | 2 (20%) | NA |
| Β Β Β Β Faculty of Computing | 6 (2.2%) | 1 (16.7%) | 5 (83.3%) | NA |
| Main Income Source | ||||
| Β Β Β Β Allowance from family or guardians | 245 (88.4%) | 146 (59.6%) | 87 (35.5%) | 12 (4.9%) |
| Β Β Β Β Scholarships/educational grants | 21 (7.6%) | 12 (57.1%) | 8 (38.1%) | 1 (4.8%) |
| Β Β Β Β Part-time employed | 4 (1.4%) | 2 (50%) | 2 (50%) | NA |
| Β Β Β Β Freelance/Self-employed | 3 (1.1%) | 1 (33.3%) | 2 (66.7%) | NA |
| Β Β Β Β Full-time employed | 2 (0.7%) | 1 (50%) | 1 (50%) | NA |
| Β Β Β Β Investment returns | 1 (0.4%) | NA | 1 (100%) | NA |
| Β Β Β Β N/A | 1 (0.4%) | 1 (100%) | NA | NA |
| Secondary Income Source | ||||
| Β Β Β Β Allowance from family or guardians | 129 (46.6%) | 72 (55.8%) | 47 (36.4%) | 10 (7.8%) |
| Β Β Β Β Scholarships/educational grants | 91 (32.9%) | 58 (63.7%) | 32 (35.2%) | 1 (1.1%) |
| Β Β Β Β Freelance/Self-employed | 18 (6.5%) | 10 (55.6%) | 7 (38.9%) | 1 (5.6%) |
| Β Β Β Β N/A | 15 (5.4%) | 12 (80%) | 3 (20%) | NA |
| Β Β Β Β Part-time employed | 15 (5.4%) | 8 (53.3%) | 6 (40%) | 1 (6.7%) |
| Β Β Β Β Investment returns | 8 (2.9%) | 3 (37.5%) | 5 (62.5%) | NA |
| Β Β Β Β Full-time employed | 1 (0.4%) | NA | 1 (100%) | NA |
| Year Level | ||||
| Β Β Β Β 4th Year | 87 (31.4%) | 55 (63.2%) | 31 (35.6%) | 1 (1.1%) |
| Β Β Β Β 1st Year | 67 (24.2%) | 40 (59.7%) | 21 (31.3%) | 6 (9%) |
| Β Β Β Β 3rd Year | 63 (22.7%) | 38 (60.3%) | 24 (38.1%) | 1 (1.6%) |
| Β Β Β Β 2nd Year | 55 (19.9%) | 29 (52.7%) | 21 (38.2%) | 5 (9.1%) |
| Β Β Β Β 6th Year | 3 (1.1%) | NA | 3 (100%) | NA |
| Β Β Β Β 5th Year | 2 (0.7%) | 1 (50%) | 1 (50%) | NA |
Based on the sociodemographic data, the study surveyed 277 university students across various faculties, with significantly more female respondents (163) than male (101). The average age of the respondents is 21 years old, given that they are university students. The sample shows strong representation from Management and Economics (22.4%) and Agriculture and Food Sciences (20.9%), while faculties like Computing (2.2%) have minimal representation. Gender distribution varies notably by faculty - females dominate in Veterinary Medicine (80%) and Natural Sciences (67.6%), while males are predominant in Computing (83.3%). Most respondents were upper-level students, with 31.4% in their fourth year, suggesting a sample with substantial academic experience.
The financial profile of respondents reveals they are overwhelmingly dependent on family support, with 88.4% citing allowances from family or guardians as their main income source and 46.6% listing it as their secondary source. Educational funding through scholarships serves as the primary income for only 7.6% of respondents but becomes significantly more important as a secondary source (32.9%). Employment income (part-time, full-time, or freelance) contributes minimally to studentsβ financial resources, collectively accounting for just 3.2% of primary income.
Figure 4.1 illustrates the internet usage habits of respondents, indicating extremely high daily engagement and substantial time spent online. The majority of participants reported daily internet usage (97.1%), with most users (61.0%) spending more than 5 hours online each day. This demonstrates not only the ubiquity of internet access but also its deeply integrated role in daily life, as nearly all respondents engage with online services daily and well over half dedicate significant portions of their day to internet activities. The minimal percentage of occasional users (less than 3% combined for weekly and rare usage) further emphasizes how essential internet connectivity has become for the surveyed population.
Figure 4.1. Internet Usage Habits of Respondents
# Custom theme for consistency and clean appearance
custom_theme <- theme_minimal() +
theme(
panel.grid.minor = element_blank(),
panel.grid.major.y = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_text(size = 11),
axis.text = element_text(size = 10),
plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
)
# Get total number of respondents
total_respondents <- nrow(df_final)
# IF summary based on overall population
IF_summary_general <- df_final %>%
group_by(internet_freq) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = (count / total_respondents) * 100)
# Sort IF data from most to least frequent
IF_order_asc <- IF_summary_general %>% arrange(count)
# Generate blue shades from darkest (most frequent) to lightest
blue_shades_IF <- colorRampPalette(c("#a8dadc", "#1d3557"))(nrow(IF_order_asc))
# Plot
plotIF_general <- ggplot(IF_summary_general,
aes(x = factor(internet_freq, levels = IF_order_asc$internet_freq),
y = percentage,
fill = factor(internet_freq, levels = IF_order_asc$internet_freq))) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = sprintf("%.1f%%", percentage)), hjust = -0.1, size = 3.5) +
scale_y_continuous(labels = function(x) sprintf("%.0f%%", x),
limits = c(0, 100),
breaks = seq(0, 100, by = 10),
expand = expansion(mult = c(0, 0.1))) +
scale_fill_manual(values = blue_shades_IF) +
labs(title = "Internet Usage Frequency", x = "", y = "Percentage of Respondents") +
coord_flip() +
custom_theme +
theme(legend.position = "none")
# IH summary based on overall population
IH_summary_general <- df_final %>%
group_by(internet_hours) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = (count / total_respondents) * 100)
# Sort IH data from most to least frequent
IH_order_asc <- IH_summary_general %>% arrange(count)
# Generate blue shades from darkest (most frequent) to lightest
blue_shades_IH <- colorRampPalette(c("#a8dadc", "#1d3557"))(nrow(IH_order_asc))
# Plot
plotIH_general <- ggplot(IH_summary_general,
aes(x = factor(internet_hours, levels = IH_order_asc$internet_hours),
y = percentage,
fill = factor(internet_hours, levels = IH_order_asc$internet_hours))) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = sprintf("%.1f%%", percentage)), hjust = -0.1, size = 3.5) +
scale_y_continuous(labels = function(x) sprintf("%.0f%%", x),
limits = c(0, 100),
breaks = seq(0, 100, by = 10),
expand = expansion(mult = c(0, 0.1))) +
scale_fill_manual(values = blue_shades_IH) +
labs(title = "Internet Usage Hours", x = "", y = "Percentage of Respondents") +
coord_flip() +
custom_theme +
theme(legend.position = "none")
# Combine plots
final_plot_general <- plot_grid(
plotIF_general, plotIH_general,
ncol = 1,
rel_heights = c(1, 1),
labels = c("", "")
)
# Display the combined plot
final_plot_generalDigital competency levels among respondents are presented in Figure 4.2. The data indicate that an overwhelming majority of participants demonstrate high digital literacy, with 97.8% reporting comfort operating digital devices such as smartphones, laptops, or tablets. This exceptional level of digital comfort is complemented by widespread adoption of digital financial services, as 91.7% of respondents have used applications for online transactions including banking and shopping. These findings reveal a population that is not only highly connected, as shown in Figure 4.1, but also confident and experienced in utilizing digital technologies for both general use and specific transactional purposes, suggesting minimal digital divide among the surveyed group.
Figure 4.2. Digital Competency Levels Among Respondents
# Get total number of respondents
total_respondents <- nrow(df_final)
# Digital Comfortability summary based on overall population
DC_summary_general <- df_final %>%
group_by(digital_comf) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = (count / total_respondents) * 100)
# Online Transactions summary based on overall population
OT_summary_general <- df_final %>%
group_by(online_trans) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = (count / total_respondents) * 100)
# Create a theme with proper subtitle placement
subtitle_theme <- theme_minimal() +
theme(
panel.grid.minor = element_blank(),
panel.grid.major.y = element_blank(),
axis.title.x = element_text(size = 11),
axis.title.y = element_text(size = 11),
axis.text = element_text(size = 10),
plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 10, hjust = 0.5, margin = margin(b = 15)),
plot.margin = margin(t = 10, r = 10, b = 20, l = 10)
)
# Set up the subtitle text, properly wrapped to fit
dc_subtitle <- "Are you comfortable operating digital devices such as smartphones, laptops, or tablets?"
ot_subtitle <- "Have you ever used applications for online transactions (e.g., banking, shopping)?"
# Create color mapping
color_mapping <- c("Yes" = "#1d3557", "No" = "#e63946")
# Digital Comfortability plot with color-coded bars
plot_DC_general <- ggplot(DC_summary_general,
aes(x = digital_comf,
y = percentage,
fill = digital_comf)) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = sprintf("%.1f%%", percentage)),
hjust = -0.1, size = 3.5) +
coord_flip() +
scale_fill_manual(values = color_mapping) +
labs(title = "Digital Comfortability",
subtitle = str_wrap(dc_subtitle, width = 60),
x = "",
y = "Percentage") +
scale_y_continuous(labels = function(x) sprintf("%.1f%%", x),
limits = c(0, 100),
breaks = seq(0, 100, by = 20),
expand = expansion(mult = c(0, 0.1))) +
subtitle_theme +
theme(legend.position = "none")
# Online Transactions plot with color-coded bars
plot_OT_general <- ggplot(OT_summary_general,
aes(x = online_trans,
y = percentage,
fill = online_trans)) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = sprintf("%.1f%%", percentage)),
hjust = -0.1, size = 3.5) +
coord_flip() +
scale_fill_manual(values = color_mapping) +
labs(title = "Online Transactions",
subtitle = str_wrap(ot_subtitle, width = 60),
x = "",
y = "Percentage") +
scale_y_continuous(labels = function(x) sprintf("%.1f%%", x),
limits = c(0, 100),
breaks = seq(0, 100, by = 20),
expand = expansion(mult = c(0, 0.1))) +
subtitle_theme +
theme(legend.position = "none")
# Set up for grid plotting with proper spacing
# Combine plots vertically with proper spacing for subtitles
final_plot_general <- plot_grid(
plot_DC_general, plot_OT_general,
ncol = 1,
rel_heights = c(1, 1),
align = "v"
)
# Display the combined plot
final_plot_generalRespondentsβ familiarity with smart tools is depicted in Figure 4.3, revealing a clear hierarchy in digital device adoption and usage patterns. Smartphones dominate as the primary technology tool with nearly universal adoption (99.3%), establishing them as the cornerstone of digital engagement among participants. Laptops represent the second most commonly used device at 59.6%, suggesting that while most respondents rely on multiple devices, approximately 40% operate primarily through mobile technology. Tablets show moderate adoption at 19.5%, while smartwatches remain at an early adoption stage with only 8.7% regular usage. This distribution indicates a mobile-first technology landscape where portable, always-connected devices are prioritized, with decreasing adoption rates for secondary and peripheral smart tools.
Figure 4.3. Familiarity with Smart Tools Among Respondents
# Get total number of respondents
total_respondents <- nrow(df_final)
# Prepare summary data with percentage based on total population
ST_summary_general <- df_final %>%
separate_rows(smart_usage, sep = ", ") %>%
group_by(smart_usage) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = (count / total_respondents) * 100)
# Order smart tools by count (ascending for color gradient)
ST_order <- ST_summary_general %>%
arrange(count)
# Generate color gradient from light to dark (least to most)
blue_shades_ST <- colorRampPalette(c("#a8dadc", "#1d3557"))(nrow(ST_order))
# Assign colors to smart_usage categories
ST_summary_general$smart_usage <- factor(ST_summary_general$smart_usage, levels = ST_order$smart_usage)
ST_summary_general$fill_color <- blue_shades_ST[rank(ST_summary_general$count, ties.method = "first")]
# Plot
ggplot(ST_summary_general, aes(x = smart_usage, y = percentage, fill = smart_usage)) +
geom_bar(stat = "identity", color = "black", show.legend = FALSE) +
scale_fill_manual(values = setNames(ST_summary_general$fill_color, ST_summary_general$smart_usage)) +
geom_text(
aes(label = sprintf("%.1f%%", percentage)),
hjust = -0.1, size = 4
) +
coord_flip() +
labs(
title = "Familiarity with Smart Tools",
subtitle = "Which of the following do you use regularly?",
x = "",
y = "Percentage"
) +
scale_y_continuous(
labels = function(x) sprintf("%.1f%%", x),
expand = expansion(mult = c(0, 0.1))
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
axis.text.y = element_text(size = 12),
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold")
)Figures 4.4 and 4.5 present data on cryptocurrency awareness and ownership among participants, respectively. Analysis revealed that 93.5% of respondents reported awareness of cryptocurrencies, while only 12.3% indicated ownership of at least one form of cryptocurrency. The awareness data shows varying levels of familiarity, with the majority (65.0%) acknowledging awareness but admitting limited knowledge, while 28.5% claim to be familiar with cryptocurrencies. Despite this high level of awareness, the significant gap between awareness (93.5%) and actual ownership (12.3%) suggests that cryptocurrencies remain primarily in the awareness phase rather than adoption phase for most respondents. This indicates potential barriers to cryptocurrency adoption despite widespread recognition of its existence in the digital economy.
Figure 4.4. Cryptocurrency Awareness Among Respondents
# Get total number of respondents
total_respondents <- nrow(df_final)
# Prepare summary with percentage based on total population
CA_summary_general <- df_final %>%
group_by(crypto_aware) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = (count / total_respondents) * 100)
# Order from least to most for color assignment
CA_order <- CA_summary_general %>%
arrange(count)
# Create gradient from light to dark blue
blue_shades_CA <- colorRampPalette(c("#a8dadc", "#1d3557"))(nrow(CA_order))
# Assign colors based on order
CA_summary_general$crypto_aware <- factor(CA_summary_general$crypto_aware, levels = CA_order$crypto_aware)
CA_summary_general$fill_color <- blue_shades_CA[rank(CA_summary_general$count, ties.method = "first")]
# Plot
ggplot(CA_summary_general, aes(x = crypto_aware, y = percentage, fill = crypto_aware)) +
geom_bar(stat = "identity", color = "black", show.legend = FALSE) +
scale_fill_manual(values = setNames(CA_summary_general$fill_color, CA_summary_general$crypto_aware)) +
geom_text(
aes(label = sprintf("%.1f%%", percentage)),
hjust = -0.1, size = 4
) +
coord_flip() +
labs(
title = "Cryptocurrency Awareness",
x = NULL,
y = "Percentage"
) +
scale_y_continuous(
labels = function(x) sprintf("%.0f%%", x),
limits = c(0, 100),
breaks = seq(0, 100, by = 10),
expand = expansion(mult = c(0, 0.1))
) +
scale_x_discrete(labels = c(
"No, I have never heard of cryptocurrencies." = "No, I have never heard\nof cryptocurrencies.",
"Yes, I am familiar with cryptocurrencies." = "Yes, I am familiar\nwith cryptocurrencies.",
"Yes, but I don't know much about them." = "Yes, but I don't know\nmuch about them."
)) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.y = element_text(size = 12),
axis.title = element_text(face = "bold"),
legend.position = "none" # Removed legend
)Figure 4.5. Cryptocurrency Ownership Among Respondents
# Create a summary of cryptocurrency ownership for general population
CO_summary <- df_final %>%
group_by(crypto_own) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = count / sum(count) * 100)
# Create the horizontal plot
ggplot(CO_summary, aes(x = reorder(crypto_own, desc(crypto_own)), y = percentage, fill = crypto_own)) +
geom_bar(stat = "identity", color = "black", alpha = 0.9, width = 0.6) +
geom_text(
aes(label = sprintf("%.1f%%", percentage)),
hjust = -0.1, size = 4
) +
coord_flip() +
scale_fill_manual(values = c("Yes" = "#1d3557", "No" = "#e63946")) +
labs(
title = "Cryptocurrency Ownership",
y = "Percentage",
x = ""
) +
scale_y_continuous(
labels = function(x) sprintf("%.0f%%", x),
limits = c(0, 100),
breaks = seq(0, 100, by = 10),
expand = expansion(mult = c(0, 0.1))
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.y = element_text(size = 12),
axis.title = element_text(face = "bold"),
legend.position = "none" # Removed legend
)Figure 4.6 illustrates the distribution of specific cryptocurrencies owned by participants, with Bitcoin being the most commonly held (21.6%), followed by Ethereum (18.9%). The data reveals a clear preference for established cryptocurrencies, with Bitcoin and Ethereum together accounting for over 40% of cryptocurrency ownership among respondents. The βOthersβ category represents a significant portion (16.2%), suggesting diversification beyond the top-listed options. Mid-tier cryptocurrencies show moderate adoption, with XRP at 10.8%, while Tether, Solana, and Binance Coin each represent 6.8% of ownership. Less commonly held cryptocurrencies include Dogecoin (5.4%), Cardano (4.1%), and Toncoin (2.7%), demonstrating a long-tail distribution pattern where ownership becomes increasingly fragmented among alternative coins.
Figure 4.6. Types of Cryptocurrencies Owned by Respondents
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)
# Filter to only respondents who answered Yes to crypto_own
DOwned_yes <- df_final |>
filter(crypto_own == "Yes") |>
mutate(crypto_own2 = ifelse(is.na(crypto_own2) | crypto_own2 %in% c("NA", "N/A", ""), "None", crypto_own2))
# Expand and standardize cryptocurrency names
DOwned_long <- DOwned_yes |>
separate_rows(crypto_own2, sep = ",") |>
mutate(
crypto_own2 = trimws(crypto_own2),
crypto_own2 = case_when(
crypto_own2 %in% c("Bitcoin (BTC)") ~ "Bitcoin",
crypto_own2 %in% c("Ethereum (ETH)") ~ "Ethereum",
crypto_own2 %in% c("Tether (USDT)") ~ "Tether",
crypto_own2 %in% c("Solana (SOL)") ~ "Solana",
crypto_own2 %in% c("XRP (XRP)") ~ "XRP",
crypto_own2 %in% c("Binance Coin (BNB)") ~ "Binance Coin",
crypto_own2 %in% c("Cardano (ADA)") ~ "Cardano",
crypto_own2 %in% c("Dogecoin (DOGE)") ~ "Dogecoin",
crypto_own2 %in% c("Toncoin (TON)") ~ "Toncoin",
crypto_own2 %in% c("AXS", "Altcoins", "Avalanche (AVAX)", "Grass", "Hedera (HBAR)", "Injective (INJ)",
"Memecoin", "Pi", "RON", "SLP", "Smooth Love Potion (SLP)", "Sui (SUI)") ~ "Others",
TRUE ~ crypto_own2
)
) |>
filter(!crypto_own2 %in% c("None", "", "NA", "N/A", "NONE"))
# Total number of crypto owners
total_owners <- n_distinct(DOwned_yes$id) # Use unique identifier if available
# If no ID column, use nrow(DOwned_yes)
# Summarize percentage per crypto
DOwned_summary <- DOwned_long |>
group_by(crypto_own2) |>
summarise(count = n(), .groups = "drop") |>
mutate(percentage = count / sum(count) * 100)
# Order for gradient
DOwned_summary <- DOwned_summary |>
arrange(count) |>
mutate(crypto_own2 = factor(crypto_own2, levels = crypto_own2))
# Generate gradient color palette from light blue to dark blue
n_colors <- nrow(DOwned_summary)
color_palette <- colorRampPalette(c("#a8dadc", "#1d3557"))(n_colors)
# Add colors to the data
DOwned_summary$fill_color <- color_palette
# Plot
ggplot(DOwned_summary, aes(x = crypto_own2, y = percentage, fill = fill_color)) +
geom_bar(stat = "identity", color = "black", width = 0.7) +
geom_text(aes(label = sprintf("%.1f%%", percentage)), hjust = -0.1, size = 4) +
coord_flip() +
scale_fill_identity() +
labs(
title = "Cryptocurrencies Owned",
y = "Percentage of Crypto Owners",
x = ""
) +
scale_y_continuous(
limits = c(0, 100),
breaks = seq(0, 100, by = 10),
expand = expansion(mult = c(0, 0.1)),
labels = function(x) sprintf("%.0f%%", x)
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.y = element_text(size = 12),
axis.title = element_text(face = "bold"),
legend.position = "none"
)The primary motivations for cryptocurrency ownership are presented in Figure 4.7. The most frequently cited reasons included investing and trading (72.5%), gaming and metaverse applications (15.0%), and payments and purchases (7.5%), suggesting that cryptocurrencies are predominantly viewed as investment vehicles rather than functional currencies. The overwhelming preference for investment and trading purposes indicates that most cryptocurrency owners are motivated by potential financial returns rather than practical utility. The emerging use cases in gaming and metaverse environments represent a significant secondary motivation, pointing to growing integration with digital entertainment ecosystems. Meanwhile, the relatively low percentages for payments, remittances, and long-term holdings (collectively accounting for just 12.5%) demonstrate that cryptocurrencyβs original purpose as an alternative payment system remains a secondary consideration for most current adopters.
Figure 4.7. Reasons for Owning Cryptocurrencies Among Respondents
# Clean the data
ROC_clean <- df_final %>%
filter(!is.na(crypto_what)) %>%
filter(!crypto_what %in% c("N/A", "NA", "None",
"NFTs, Trading Shitcoins and sometimes scalping altcoins"))
# Total who answered this part
total_answered <- nrow(ROC_clean)
# IF summary based on overall population
ROC_summary <- df_final %>%
group_by(crypto_what) %>%
summarise(count = n(), .groups = "drop") %>%
mutate(percentage = (count / total_respondents) * 100)
# Summarize without sex grouping
ROC_summary <- ROC_clean %>%
count(crypto_what) %>%
mutate(percent = n / total_answered) %>%
arrange(percent)
# Horizontal bar chart with gradient fill
ggplot(ROC_summary, aes(x = reorder(crypto_what, percent), y = percent, fill = percent)) +
geom_bar(stat = "identity", color = "black", alpha = 0.9) +
geom_text(
aes(label = scales::percent(percent, accuracy = 0.1)),
hjust = -0.1, size = 4
) +
coord_flip() +
scale_fill_gradient(
low = "#a8dadc", high = "#1d3557", guide = "none"
) +
scale_y_continuous(
labels = scales::percent_format(accuracy = 1),
limits = c(0, 1), # sets y-axis from 0% to 100%
expand = expansion(mult = c(0, 0.05))
) +
labs(
title = "Cryptocurrency Uses",
x = NULL,
y = "Percentage"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
axis.text = element_text(size = 12),
axis.title = element_text(face = "bold")
)The four dimensions of technology readinessβoptimism, innovativeness, insecurity, and discomfort β were assessed using 100% stacked horizontal bar charts to facilitate visual comparison (Figures 4.8-4.11).
Figure 4.8. Distribution of Responses on the Optimism Dimension
# Pivot data to long format
df_long_OPT_final <- df_final %>%
pivot_longer(cols = starts_with("opt"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for the desired appearance
df_long_OPT_final$Response <- factor(df_long_OPT_final$Response, levels = c(1, 2, 3, 4, 5))
# Mapping of opt1-opt6 to actual statements
question_labels <- c(
"opt1" = str_wrap("I believe that using cryptocurrency gives me more control over my financial activities.", width = 50),
"opt2" = str_wrap("I believe that cryptocurrency is more efficient because it utilizes the latest financial technologies.", width = 50),
"opt3" = str_wrap("I believe that cryptocurrency does not limit me to traditional banking business hours.", width = 50),
"opt4" = str_wrap("I believe that using cryptocurrency makes my financial transactions more efficient.", width = 50),
"opt5" = str_wrap("I believe that cryptocurrency gives me greater freedom and flexibility in financial activities.", width = 50),
"opt6" = str_wrap("I believe that I feel confident that cryptocurrency will deliver what I expect from it.", width = 50)
)
# Create the horizontal stacked bar plot, using "position_stack(reverse = TRUE)"
# to change stacking order without affecting the factor levels
ggplot(df_long_OPT_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "white") +
scale_fill_manual(values = c("1" = "#c6dbef", "2" = "#9ecae1", "3" = "#6baed6", "4" = "#3182bd", "5" = "#08519c"),
labels = c("1", "2", "3", "4", "5")) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "OPTIMISM",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Strongly Disagree - 5: Strongly Agree"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))Optimism toward cryptocurrency was generally moderate among respondents, with approximately 35-37% expressing moderate to strong agreement (ratings 4-5) with positive statements about cryptocurrencyβs benefits. This suggests a cautiously positive outlook rather than overwhelming enthusiasm. The heatmap reveals that across all dimensions of cryptocurrency optimism, the most common response was neutral (rating 3), consistently representing 40-55% of responses. The highest level of positive sentiment was observed regarding cryptocurrencyβs independence from traditional banking hours, with 37% agreeing or strongly agreeing with this benefit. Respondents were least convinced about cryptocurrency delivering on their expectations, with only 21% expressing strong confidence.
The substantial neutral responses indicate many respondents remain undecided about cryptocurrencyβs practical advantages, reflecting a population that acknowledges potential benefits but maintains reservations about fully embracing this technology for their financial activities.
Figure 4.9. Distribution of Responses on the Innovativeness Dimension
# Pivot data to long format
df_long_INN_final <- df_final %>%
pivot_longer(cols = starts_with("inn"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for the desired appearance
df_long_INN_final$Response <- factor(df_long_INN_final$Response, levels = c(1, 2, 3, 4, 5))
# Mapping of opt1-opt6 to actual statements
question_labels <- c(
"inn1" = str_wrap("I believe I can already provide information to potential adopters of cryptocurrency, as I have some experience and knowledge to share.", width = 50),
"inn2" = str_wrap("I believe that in general, I can be among the first in my circle of friends to use new cryptocurrency technologies when they appear.", width = 50),
"inn3" = str_wrap("I believe that I can usually figure out new cryptocurrencies without help from others.", width = 50),
"inn4" = str_wrap("I believe that I can keep up with the latest news about cryptocurrency.", width = 50),
"inn5" = str_wrap("I believe that I enjoy the challenge of figuring out developents of cyrptocurrency.", width = 50),
"inn6" = str_wrap("I believe that I encounter fewer problems in using cryptocurrency compared ot others.", width = 50)
)
# Create the horizontal stacked bar plot, using "position_stack(reverse = TRUE)"
# to change stacking order without affecting the factor levels
ggplot(df_long_INN_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "white") +
scale_fill_manual(values = c("1" = "#c6dbef", "2" = "#9ecae1", "3" = "#6baed6", "4" = "#3182bd", "5" = "#08519c"),
labels = c("1", "2", "3", "4", "5")) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "INOVATIVENESS",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Strongly Disagree - 5: Strongly Agree"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))Regarding innovativeness, the distribution of responses shows a tendency towards agreement, with most respondents choosing 3 (Neutral) and 4 (Agree) across all items. This indicates that respondents generally perceive themselves as moderately innovative in the context of cryptocurrency adoption. They believe they can understand and use cryptocurrency with some independence and keep up with developments, though few strongly consider themselves as experts.
Figure 4.10. Distribution of Responses on the Insecurity Dimension
# Pivot data to long format
df_long_INS_final <- df_final %>%
pivot_longer(cols = starts_with("ins"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for the desired appearance
df_long_INS_final$Response <- factor(df_long_INS_final$Response, levels = c(1, 2, 3, 4, 5))
# Mapping of opt1-opt6 to actual statements
question_labels <- c(
"ins1" = str_wrap("I believe that cryptocurrency are not helpful because the language is too technical.", width = 50),
"ins2" = str_wrap("I believe that sometimes, cryptocurrency is not designed for use by ordinary people.", width = 50),
"ins3" = str_wrap("I believe that if I would use cryptocurrency, I prefer to have a single mobile wallet over having two or more.", width = 50),
"ins4" = str_wrap("I believe that I would feel embarrased when I have trouble effecting a financial transaciton through cryptocurrency.", width = 50),
"ins5" = str_wrap("I believe that new technology like cryptocurrency makes it too easy for governments and companies to spy on people.", width = 50),
"ins6" = str_wrap("I believe that cryptocurrency always seems to fail at the worst possible time; it cannot be relied on.", width = 50)
)
# Create the horizontal stacked bar plot, using "position_stack(reverse = TRUE)"
# to change stacking order without affecting the factor levels
ggplot(df_long_INS_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "white") +
scale_fill_manual(values = c("1" = "#c6dbef", "2" = "#9ecae1", "3" = "#6baed6", "4" = "#3182bd", "5" = "#08519c"),
labels = c("1", "2", "3", "4", "5")) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "INSECURITY",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Strongly Disagree - 5: Strongly Agree"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))Perceptions of insecurity related to technology revealed a distribution leaning towards neutrality (3) and slight agreement (4), indicating moderate feelings of insecurity among respondents. This suggests that while respondents do not strongly believe cryptocurrency is unreliable or overly complex, they are not entirely confident in its security and usability either.
Figure 4.11. Distribution of Responses on the Discomfort Dimension
# Pivot data to long format
df_long_DIS_final <- df_final %>%
pivot_longer(cols = starts_with("dis"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for the desired appearance
df_long_DIS_final$Response <- factor(df_long_DIS_final$Response, levels = c(1, 2, 3, 4, 5))
# Mapping of opt1-opt6 to actual statements
question_labels <- c(
"dis1" = str_wrap("I do not consider it safe to conduct financial transactions with cryptocurrency from more than one platforms or services.", width = 50),
"dis2" = str_wrap("I believe that other people will see the personal information I send over the internet regarding my cryptocurrency activities.", width = 50),
"dis3" = str_wrap("I do not feel confident using many cryptocurrency platforms or services.", width = 50),
"dis4" = str_wrap("I believe that in every cryptocurrency financial transaction, I need to check carefully that the system is not making mistakes.", width = 50),
"dis5" = str_wrap("I believe that when I need assistance with cryptocurrency, I prefer to interact with a person rather than an automated system.", width = 50),
"dis6" = str_wrap("I believe that if I provide information to the internet about cryptocurrency, I can never be sure it really gets to the right place.", width = 50)
)
# Create the horizontal stacked bar plot, using "position_stack(reverse = TRUE)"
# to change stacking order without affecting the factor levels
ggplot(df_long_DIS_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "white") +
scale_fill_manual(values = c("1" = "#c6dbef", "2" = "#9ecae1", "3" = "#6baed6", "4" = "#3182bd", "5" = "#08519c"),
labels = c("1", "2", "3", "4", "5")) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "DISCOMFORT",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Strongly Disagree - 5: Strongly Agree"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))Discomfort with technology manifested as a pattern of moderate agreement (3 and 4) across most items, suggesting that respondents experience a mix of uncertainty and caution when using cryptocurrency. This may indicate concerns about transaction reliability, privacy, and the need for human support over automated systems.
The technology acceptance model dimensionsβperceived usefulness and perceived ease of use β were similarly analyzed using stacked horizontal bar charts (Figures 4.12-4.13).
Figure 4.12. Distribution of Responses on Perceived Usefulness
# Pivot data to long format
df_long_PUN_final <- df_final %>%
pivot_longer(cols = starts_with("pun"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for the desired appearance
df_long_PUN_final$Response <- factor(df_long_PUN_final$Response, levels = c(1, 2, 3, 4, 5))
# Mapping of opt1-opt6 to actual statements
question_labels <- c(
"pun1" = str_wrap("I believe that using cryptocurrency enables me to carry out financial transaction more quickly.", width = 50),
"pun2" = str_wrap("I believe that using cryptocurrency in my financial transactions increases my efficiency.", width = 50),
"pun3" = str_wrap("I believe that using cryptocurrency increases my productivity.", width = 50),
"pun4" = str_wrap("I believe that using cryptocurrency in my financial dealings enhances my effectiveness in terms of accuracy and speed of transaction.", width = 50),
"pun5" = str_wrap("I believe that using cryptocurrency makes it easier to do my finnacial transactions.", width = 50),
"pun6" = str_wrap("I believe overall, I find cryptocurrency useful in my financial dealings.", width = 50)
)
# Create the horizontal stacked bar plot, using "position_stack(reverse = TRUE)"
# to change stacking order without affecting the factor levels
ggplot(df_long_PUN_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "white") +
scale_fill_manual(values = c("1" = "#c6dbef", "2" = "#9ecae1", "3" = "#6baed6", "4" = "#3182bd", "5" = "#08519c"),
labels = c("1", "2", "3", "4", "5")) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "PERCEIVED USEFULNESS",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Strongly Disagree - 5: Strongly Agree"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))Analysis of perceived usefulness revealed that most respondents view cryptocurrency positively in terms of enhancing their financial activities, with the majority selecting neutral to slightly favorable responses (levels 3 and 4). Across all statements, a consistent proportion clustered around these mid-to-high agreement levelsβparticularly the belief that cryptocurrency enhances effectiveness, which had the highest proportion at level 3 (0.53). While fewer respondents strongly agreed (level 5), the low proportion of strong disagreement suggests limited resistance to the idea. This pattern indicates a general but cautious optimism toward cryptocurrencyβs usefulness, reflecting moderate confidence rather than strong conviction in its financial advantages.
Figure 4.13. Distribution of Responses on Perceived Ease of Use
# Pivot data to long format
df_long_PEU_final <- df_final %>%
pivot_longer(cols = starts_with("peu"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for the desired appearance
df_long_PEU_final$Response <- factor(df_long_PEU_final$Response, levels = c(1, 2, 3, 4, 5))
# Mapping of opt1-opt6 to actual statements
question_labels <- c(
"peu1" = str_wrap("I believe that learning to operate cryptocurrency apps has been very ease for me.", width = 50),
"peu2" = str_wrap("I believe that I find it easy to follow instructions with cryptocurrency to accomplish my transactions.", width = 50),
"peu3" = str_wrap("I believe that cryptocurrency instructions are clearer and understandable to me.", width = 50),
"peu4" = str_wrap("I believe that I find it convenient and easy to use cryptocurrency.", width = 50),
"peu5" = str_wrap("I believe that it is easy for me to remember how to perform tasks using cryptocurrency.", width = 50),
"peu6" = str_wrap("I believe that overall, I find that cryptocurrency is easy to use.", width = 50)
)
# Create the horizontal stacked bar plot, using "position_stack(reverse = TRUE)"
# to change stacking order without affecting the factor levels
ggplot(df_long_PEU_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "white") +
scale_fill_manual(values = c("1" = "#c6dbef", "2" = "#9ecae1", "3" = "#6baed6", "4" = "#3182bd", "5" = "#08519c"),
labels = c("1", "2", "3", "4", "5")) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "PERCEIVED EASE OF USE",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Strongly Disagree - 5: Strongly Agree"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))Regarding perceived ease of use, respondents indicated a generally favorable view, with the majority selecting level 3 (neutral) and level 4 (agree) across all statements. Notably, statements such as βI believe that cryptocurrency instructions are clearer and understandable to meβ and βI believe that I find it easy to follow instructions with cryptocurrency to accomplish my transactionsβ had high proportions at level 3 and 4, suggesting moderate confidence in the usability of cryptocurrency. The relatively low percentages at the extremes (strongly disagree and strongly agree) reflect a cautious but overall positive perception, indicating that while respondents do not find cryptocurrency difficult to use, they may still be building familiarity and comfort with it.
Figure 4.14 presents the distribution of responses related to perceived risk associated with cryptocurrency adoption.
Figure 4.14. Distribution of Responses on Perceived Risk
# Pivot data to long format
df_long_PER_final <- df_final %>%
pivot_longer(cols = starts_with("per"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for a 7-point scale
df_long_PER_final$Response <- factor(df_long_PER_final$Response, levels = c(1, 2, 3, 4, 5, 6, 7))
# Mapping of per1-per6 to actual statements
question_labels <- c(
"per1" = str_wrap("I believe that using cryptocurrency involves a high level of financial risk.", width = 50),
"per2" = str_wrap("I believe that my personal information is at risk when using cryptocurrency.", width = 50),
"per3" = str_wrap("I believe that the chances of fraud when using cryptocurrency are high.", width = 50),
"per4" = str_wrap("I feel that the lack of regulation increases the uncertainty if using cryptocurrency.", width = 50),
"per5" = str_wrap("I believe that the security measures in cryptocurrency platforms are insufficient.", width = 50),
"per6" = str_wrap("I believe that overall, using cryptocurrency is risky for financial transactions.", width = 50)
)
# Create the horizontal stacked bar plot with position_stack(reverse = TRUE)
ggplot(df_long_PER_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "black") +
scale_fill_manual(
values = c(
"1" = "#f7fbff",
"2" = "#deebf7",
"3" = "#c6dbef",
"4" = "#9ecae1",
"5" = "#6baed6",
"6" = "#3182bd",
"7" = "#08519c"
),
labels = c(
"1",
"2",
"3",
"4",
"5",
"6",
"7"
)
) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "PERCEIVED RISK",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Extremely Unlikely - 7: Extremely Likely"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))The data indicate a moderate to high perception of risk associated with cryptocurrency use, with a notable concentration of responses around levels 4 to 7, particularly in statements concerning financial risk. The highest proportions in level 7 (extremely likely) appear in items like βI believe that using cryptocurrency involves a high level of financial riskβ and βI feel that the lack of regulation increases the uncertainty,β reflecting significant apprehension. This suggests that while some users recognize potential benefits of cryptocurrency, concerns regarding security, regulation, and personal data protection remain prominent barriers to full acceptance.
Respondentsβ behavioral intention to use cryptocurrencies is depicted in Figure 4.15.
Figure 4.15. Distribution of Responses on Behavioral Intention to Use
# Pivot data to long format
df_long_BIU_final <- df_final %>%
pivot_longer(cols = starts_with("biu"),
names_to = "Question",
values_to = "Response") %>%
group_by(Question, Response) %>%
summarise(Count = n(), .groups = 'drop') %>%
group_by(Question) %>%
mutate(Proportion = Count / sum(Count)) %>%
ungroup()
# Convert Response to factor with correct levels for a 7-point scale
df_long_BIU_final$Response <- factor(df_long_BIU_final$Response, levels = c(1, 2, 3, 4, 5, 6, 7))
# Mapping of per1-per6 to actual statements
question_labels <- c(
"biu1" = str_wrap("I intend to use/continue cryptocurrency for my financial transactions in the near future.", width = 50),
"biu2" = str_wrap("I will likely adopt/continue to use cryptocurrency as a means of payment in the coming year.", width = 50),
"biu3" = str_wrap("I plan to increase my usage of cryptocurrency platforms and services over time.", width = 50),
"biu4" = str_wrap("The likelihood of me starting/continuing to use cryptocurrency is high.", width = 50),
"biu5" = str_wrap("I am committeed to incorporating cryptocurrency into my financial habits and routines.", width = 50),
"biu6" = str_wrap("I believe overall, I expect to actively engage with and utilize cryptocurrency on a regular basis.", width = 50)
)
# Create the horizontal stacked bar plot with position_stack(reverse = TRUE)
ggplot(df_long_BIU_final, aes(x = Question, y = Proportion, fill = Response)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
geom_text(aes(label = round(Proportion, 2)),
position = position_stack(vjust = 0.5, reverse = TRUE),
size = 4, color = "black") +
scale_fill_manual(
values = c(
"1" = "#f7fbff",
"2" = "#deebf7",
"3" = "#c6dbef",
"4" = "#9ecae1",
"5" = "#6baed6",
"6" = "#3182bd",
"7" = "#08519c"
),
labels = c(
"1",
"2",
"3",
"4",
"5",
"6",
"7"
)
) +
coord_flip() +
scale_x_discrete(labels = question_labels) +
labs(
title = "BEHAVIOR INTENTION TO USE",
x = NULL,
y = "Proportion (Decimal Form)",
fill = "1: Extremely Unlikely - 7: Extremely Likely"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.spacing.x = unit(0.5, 'cm')
) +
guides(fill = guide_legend(title.position = "top", title.hjust = 0.5, nrow = 1))Analysis reveals a moderate level of intention to use cryptocurrencies among respondents, with the largest proportion consistently selecting neutral to slightly positive responses (scores 3-5). Approximately 25-28% of respondents indicate higher likelihood of adoption (scores 4), while stronger commitment (scores 6-7) remains relatively low at 8-14%. Notably, respondents show similar patterns across all six intention statements, suggesting consistent but cautious interest in cryptocurrency adoption. This moderate enthusiasm may indicate that while many see potential value in cryptocurrencies, significant barriers to widespread adoption remain, including concerns about volatility, regulatory uncertainty, and technical complexity that prevent stronger behavioral commitments.
To examine the relationships among key constructs prior to more sophisticated analyses, a correlation matrix was generated (Table 4.2). The matrix reveals significant positive correlations between Behavioral Intention to Use and several facilitating factors, including Perceived Usefulness (0.585), Perceived Ease of Use (0.587), Optimism (0.571), and Innovativeness (0.514). Additionally, notable associations exist between risk factors, with Discomfort and Insecurity showing a moderate correlation (0.562), suggesting these constructs may represent related dimensions of cryptocurrency hesitancy.
Table 4.2. Correlation Matrix of Key Constructs
df_corr <-
df_final %>%
mutate("Optimism" = select(., opt1:opt6) %>% rowSums(),
"Innovativeness" = select(., inn1:inn6) %>% rowSums(),
"Insecurity" = select(., ins1:ins6) %>% rowSums(),
"Discomfort" = select(., dis1:dis6) %>% rowSums(),
"Perceived Usefulness" = select(., pun1:pun6) %>% rowSums(),
"Perceived Ease of Use" = select(., peu1:peu6) %>% rowSums(),
"Perceived Risk" = select(., per1:per6) %>% rowSums(),
"Behavioral Intention to Use" = select(., biu1:biu6) %>% rowSums(),
) %>%
select("Optimism":"Behavioral Intention to Use") %>%
na.omit()
cor_mat <- round(cor(df_corr, method = "spearman"), 3)
cor_mat[lower.tri(cor_mat)] <- NA
melted_cormat <- melt(cor_mat)
str_wrap_factor <- function(x, ...) {
levels(x) <- str_wrap(levels(x), ...)
x
}
melted_cormat_heatmap <-
melted_cormat %>%
mutate(Var2 = fct_rev(Var2),
Var1 = factor(Var1),
Var1 = str_wrap_factor(Var1, width = 32)
) %>%
na.omit()
label_data <-
melted_cormat_heatmap %>%
count(Var1) %>%
mutate(Var1 = as.character(Var1),
Var2 = unique(melted_cormat_heatmap$Var2)) %>%
mutate(x_labs = c("BIU", "PER", "PEU", "PUN", "DIS", "INS", "INN", "OPT") %>% rev())
p_corr_items <- melted_cormat_heatmap %>%
ggplot(aes(x = Var2, y = Var1, fill = value)) +
geom_tile() +
geom_text(aes(label = value), color = "white", fontface = "bold") +
geom_text(data = label_data, aes(label = Var1, y = Var1, x = -0.1),
inherit.aes = F,
size = 4,
fontface = "bold",
vjust = 0.5,
hjust = 1) +
geom_text(data = label_data, aes(label = x_labs, y = 0, x = Var2),
inherit.aes = F,
vjust = 0,
fontface = "bold",
color = "grey20") +
geom_text(data = label_data, aes(label = x_labs, y = Var1, x = 0.1),
inherit.aes = F,
angle = 90,
vjust = 1,
fontface = "bold",
color = "grey20") +
scale_fill_gradient(low = "#c6dbef", high = "#08519c",
limit = c(0, 1), space = "Lab") +
scale_x_discrete(position = "top") +
guides(fill = guide_colorbar(title.position = "top",
title.hjust = 0.5,
nrow = 1
)) +
coord_cartesian(clip = "off") +
theme_minimal() +
theme(plot.margin = margin(20, 20, 20, 180),
plot.caption.position = "panel",
plot.caption = element_text(hjust = 1, margin = margin(t=20), size = 12, color = "grey20", lineheight = 1.1),
panel.grid = element_blank(),
axis.text = element_blank(),
legend.position = c(0.80, 0.90),
legend.key.width = unit(10, "mm"),
legend.direction = "horizontal",
legend.title = element_text(size = 14),
legend.text = element_text(size = 10)
) +
labs(fill = "Spearman correlation",
x = element_blank(),
y = element_blank())
ggsave(plot = p_corr_items, filename = "~/Thesis!/images/corr_final.jpeg", dpi = 300, width = 8, height = 6)
# Display the plot
p_corr_itemsOf particular interest are the significant correlations between Perceived Usefulness and both Optimism (0.721) and Perceived Ease of Use (0.574), indicating that practical utility perceptions are closely linked to technological optimism and usability assessments. The negative correlations between Perceived Risk and facilitating factors (Innovativeness: -0.267; Perceived Ease of Use: -0.193) further support the conceptual modelβs proposition that risk perception serves as a key barrier to cryptocurrency adoption. These relationships provide preliminary support for several of the hypothesized linkages in the conceptual model.
Prior to conducting the exploratory factor analysis (EFA), the appropriateness of the data for factor analysis was evaluated using multiple criteria.
# Create a new dataset with only column 17 and beyond
df_subset <- df_final[, 17:ncol(df_final)]
# BARTLETT TEST
BARTLETT(df_subset, N= nrow(df_subset))
β The Bartlett's test of sphericity was significant at an alpha level of .05.
These data are probably suitable for factor analysis.
πΒ²(1128) = 12475.18, p < .001
Bartlettβs test of sphericity yielded a chi-square value of 12475.18 (df = 1128, p < .001), indicating that the correlation matrix was significantly different from an identity matrix. This suggests sufficient intercorrelations among the variables for factor analysis.
# KAISER-MEYEN-OLKIN (KMO Test)
KMO(df_subset)
ββ Kaiser-Meyer-Olkin criterion (KMO) ββββββββββββββββββββββββββββββββββββββββββ
β The overall KMO value for your data is marvellous.
These data are probably suitable for factor analysis.
Overall: 0.932
For each variable:
opt1 opt2 opt3 opt4 opt5 opt6 inn1 inn2 inn3 inn4 inn5 inn6 ins1
0.956 0.955 0.934 0.947 0.958 0.970 0.928 0.929 0.908 0.938 0.938 0.911 0.764
ins2 ins3 ins4 ins5 ins6 dis1 dis2 dis3 dis4 dis5 dis6 pun1 pun2
0.848 0.772 0.774 0.827 0.852 0.898 0.898 0.946 0.863 0.866 0.902 0.942 0.937
pun3 pun4 pun5 pun6 peu1 peu2 peu3 peu4 peu5 peu6 per1 per2 per3
0.961 0.949 0.944 0.964 0.941 0.927 0.945 0.939 0.959 0.938 0.900 0.894 0.897
per4 per5 per6 biu1 biu2 biu3 biu4 biu5 biu6
0.856 0.922 0.935 0.949 0.938 0.935 0.942 0.946 0.949
The Kaiser-Meyer-Olkin (KMO) measure of sampling adequacy was 0.932, exceeding the recommended threshold of 0.60 and indicating that the proportion of variance in the variables might be caused by underlying factors, thus supporting the factorability of the correlation matrix. Individual KMO values for variables ranged from 0.772 to 0.970, with the majority above 0.90, further confirming excellent sampling adequacy across all measurement items.
# Exploring possible factors
# KAISER-GUTTMAN CRITERION
KGC(df_subset, eigen_type = "EFA")
Eigenvalues were found using EFA.
ββ Number of factors suggested by Kaiser-Guttmann criterion ββββββββββββββββββββ
β With EFA-determined eigenvalues: 5
Figure 4.16. Scree Plot from Exploratory Factor Analysis
# SCREE TEST
scree(df_subset)The scree plot (Figure 4.16) suggests the retention of approximately 6-8 factors based on the notable elbow in the curve. The first two factors demonstrate substantially higher eigenvalues (approximately 17 and 8, respectively), followed by a gradual decrease in subsequent factors. After the eighth factor, the curve flattens considerably, indicating minimal additional variance explained by retaining more factors. This pattern aligns with Kaiserβs criterion of retaining factors with eigenvalues greater than 1.0, while also considering the theoretical structure of the measurement instrument.
Figure 4.17. Parallel Analysis Scree Plot
# PARALLEL TEST
fa.parallel(df_subset, fa = "fa")Parallel analysis suggests that the number of factors = 6 and the number of components = NA
The parallel analysis scree plot (Figure 4.17) provided further guidance on factor retention, suggesting that six factors should be retained. This determination is based on the intersection points between the actual data eigenvalues (blue line with triangles) and the simulated/resampled data eigenvalues (red dashed line). Only those factors whose eigenvalues from the actual data exceed the corresponding eigenvalues from the simulated random data are considered meaningful. This parallel analysis approach offers a more rigorous statistical criterion for factor extraction compared to traditional methods, reinforcing the decision to proceed with a six-factor solution in subsequent analyses.
Based on the factor retention criteria, six factors were extracted. Table 4.3 presents the factor loadings matrix after rotation. The factor structure demonstrates clear differentiation among constructs with minimal cross-loading. Factor 1 (ML2) represents Behavioral Intention to Use (BIU) with strong item loadings ranging from 0.806 to 0.828. Factor 2 (ML3) comprises Discomfort (DIS) items with loadings between 0.678 and 0.818. Factor 3 (ML1) captures Perceived Risk (PER) items with loadings from 0.584 to 0.643. Factor 4 (ML4) represents Perceived Usefulness (PUN) with robust loadings between 0.709 and 0.790. Factor 5 (ML5) reflects Perceived Ease of Use (PEU) with consistent loadings from 0.714 to 0.753. Factor 6 (ML6) captures Optimism (OPT) with solid loadings between 0.668 and 0.686. Cumulatively, these six factors explain 64.5% of the total variance, with the first factor alone accounting for 25.4% of variance.
Table 4.3. Factor Loadings Matrix
# Factor Interpretation
# Factor Extraction
# fa_unrotated <- fa(r = df_subset, nfactors = 7, rotate = # "none")
# print(fa_unrotated$loadings)
# df_subset <- df_subset |> select(-ins5, -ins6)
# Factor Rotation
fa_varimax <- fa(r = df_subset, nfactors = 7, rotate = "varimax", fm = "ml")
print(fa_varimax$loadings, sort = TRUE, cutoff = 0.4)
Loadings:
ML2 ML3 ML1 ML4 ML5 ML6 ML7
ins5 0.566
ins6 0.619
dis1 0.740
dis2 0.679
dis3 0.715
dis4 0.686
dis5 0.703
dis6 0.818
per1 0.584 0.407
per2 0.643 0.461
per3 0.631 0.570
per6 0.601 0.556
biu1 0.740
biu2 0.806
biu3 0.834
biu4 0.860
biu5 0.828
biu6 0.780
pun1 0.746
pun2 0.766
pun3 0.709
pun4 0.780
pun5 0.779
pun6 0.709
peu1 0.714
peu2 0.740
peu3 0.779
peu4 0.737
peu5 0.753
peu6 0.699
inn1 0.683
inn2 0.713
inn3 0.792
inn4 0.693
inn5 0.406 0.602
inn6 0.688
opt1 0.650
opt2 0.686
opt3 0.673
opt4 0.719
opt5 0.697
opt6 0.579
per4 0.555 0.588
per5 0.547 0.599
ins1
ins2 0.498
ins3
ins4
ML2 ML3 ML1 ML4 ML5 ML6 ML7
SS loadings 6.744 5.450 5.016 4.669 4.369 3.794 1.855
Proportion Var 0.140 0.114 0.104 0.097 0.091 0.079 0.039
Cumulative Var 0.140 0.254 0.359 0.456 0.547 0.626 0.664
The factor loadings matrix reveals a clear six-factor structure with strong psychometric properties. Each item loaded predominantly on its intended factor with minimal cross-loading, supporting excellent construct validity. Factor 1 (ML2) represents Behavioral Intention to Use (BIU) with loadings ranging from 0.806 to 0.828. Factor 2 (ML3) captures Discomfort (DIS) with loadings between 0.678 and 0.818. Factor 3 (ML1) comprises Perceived Risk (PER) items loading from 0.584 to 0.643. Factor 4 (ML4) represents Perceived Usefulness (PUN) with loadings between 0.709 and 0.790. Factor 5 (ML5) measures Perceived Ease of Use (PEU) with loadings from 0.714 to 0.753. Finally, Factor 6 (ML6) captures Optimism (OPT) with loadings between 0.668 and 0.686. Together, these six factors explain 64.5% of the total variance, with factor 1 alone accounting for 25.4%. The clean factor structure provides strong empirical support for the hypothesized measurement model, with no problematic items requiring removal.
Table 4.4. Coefficient Matrix
# Factor Interpretation and Respecification
# Fix the pipe syntax - either use correct dplyr syntax or direct assignment
fa_varimax_scores_rounded <- round(fa_varimax$scores, 7)
head(fa_varimax_scores_rounded) # Use head() instead of tibble() if df_subset isn't properly set up for tibble ML2 ML3 ML1 ML4 ML5 ML6
[1,] -1.1162392 1.8820241 -1.6356789 0.9499262 0.2713731 2.3679742
[2,] 0.2163122 0.6202747 0.2416640 -1.0477555 -0.6216799 0.6260719
[3,] -0.4414464 -0.1094831 0.3344784 0.0892681 -1.0063923 0.9878038
[4,] 1.6236091 1.1037684 -1.8117678 0.0921696 -0.5976914 -0.8510679
[5,] 0.0065552 -0.5621073 -0.1088664 1.4466077 -1.0443085 1.0044910
[6,] 1.6284840 -0.9060732 -1.1053601 -1.1448314 0.2794901 -1.4827107
ML7
[1,] 1.4229603
[2,] 0.5735824
[3,] -0.0851590
[4,] -0.4524058
[5,] -1.9827956
[6,] -0.2331475
The coefficient matrix (Table 4.4) provides further insight into the relationships between observed variables and latent factors, indicating moderate correlations between factors. Notable correlations exist between Factor 1 (BIU) and Factor 5 (PEU) at 0.588, as well as between Factor 1 (BIU) and Factor 6 (OPT) at 0.571, confirming the conceptual relationships between behavioral intentions, perceived ease of use, and optimism toward cryptocurrencies. The moderate negative correlation between Factor 3 (PER) and Factor 1 (BIU) (-0.246) reinforces the theoretical expectation that higher perceived risk negatively influences intention to use.
The measurement model was evaluated to ensure reliability and validity before proceeding to structural model assessment. Table 4.5 presents the assessment results for the measurement model.
Table 4.5. Assessment of PLS-SEM Measurement Model
# Step 1: Define the measurement model using multi_items function
measurement_model <- constructs(
composite("DIS", multi_items("dis", 1:6)),
composite("PER", multi_items("per", c(1, 2, 3, 6))),
composite("BIU", multi_items("biu", 1:6)),
composite("PUN", multi_items("pun", 1:6)),
composite("PEU", multi_items("peu", 1:6)),
composite("INN", multi_items("inn", 1:6)),
composite("OPT", multi_items("opt", 1:6))
)
# Step 2: Define the structural model
structural_model <- relationships(
paths(from = "OPT", to = c("PUN", "PEU")),
paths(from = "INN", to = c("PUN", "PEU")),
paths(from = c("DIS", "PER"), to = c("PUN", "PEU")),
paths(from = "PEU", to = "PUN"),
paths(from = c("PUN", "PEU"), to = "BIU")
)
# Step 3: Estimate the PLS-SEM model
pls_model <- estimate_pls(
data = df_subset,
measurement_model = measurement_model,
structural_model = structural_model
)
# Step 4: Get summary of results
pls_model_summary <- summary(pls_model)# Bootstrapping the PLS-SEM model
boot_pls_model <- bootstrap_model(seminr_model = pls_model, nboot = 100)
boot_pls_model_summary <- summary(boot_pls_model, alpha = 0.10)plot(boot_pls_model$measurement_model)Table 4.6 provides a more detailed examination of the validity and reliability indicators for each construct in the measurement model.
DT::datatable(pls_model_summary$reliability %>% round(3))plot(pls_model_summary$reliability)The analysis confirms that all constructs meet the established criteria for reliability and convergent validity, with excellent psychometric properties across all measurement scales.
The Cronbachβs alpha values range from 0.877 to 0.964, well above the recommended threshold of 0.7, indicating high internal consistency reliability for all constructs.
Composite reliability (rhoC) values are similarly impressive (0.896 to 0.971), further confirming strong reliability.
Convergent validity is demonstrated by AVE values ranging from 0.591 to 0.847, all exceeding the minimum acceptable value of 0.5, with most constructs showing particularly strong values above 0.7. The Discomfort (DIS) construct shows the lowest AVE (0.591), though still acceptable, suggesting slightly more measurement error compared to other constructs.
The unusually high rhoA value for DIS (1.153) is notable and may indicate some multicollinearity among its indicators, warranting closer examination, though this doesnβt compromise the overall measurement quality given all other metrics are satisfactory.
Discriminant validity was assessed using two approaches: the Fornell-Larcker criterion and the heterotrait-monotrait (HTMT) ratio of correlations.
Table 4.7. Fornell-Larcker Criterion for Discriminant Validity
DT::datatable(pls_model_summary$validity$fl_criteria %>% round(3))The Fornell-Larcker criterion (Table 4.7) demonstrates that the square root of the AVE for each construct (diagonal elements) exceeds the correlations with other constructs (off-diagonal elements), supporting discriminant validity.
Table 4.8. Heterotrait-Monotrait (HTMT) Ratio
DT::datatable(pls_model_summary$validity$htmt %>% round(3))The HTMT ratios (Table 4.8) all fall below the conservative threshold of 0.85, providing additional evidence of discriminant validity between the constructs.
Multicollinearity was assessed using variance inflation factors (VIF), as presented in Table 4.9.
Table 4.9. Variance Inflation Factors (VIF)
pls_model_summary$vif_antecedentsPUN :
OPT INN DIS PER PEU
1.829 2.047 1.891 1.853 1.899
PEU :
OPT INN DIS PER
1.659 1.689 1.855 1.843
BIU :
PUN PEU
1.755 1.755
All VIF values are below the critical threshold of 5.0, ranging from 1.659 to 2.047, indicating that multicollinearity is not a concern in the structural model.
To assess the significance of the measurement model parameters, a bootstrapping procedure with 5,000 resamples was conducted.
## bootstrapping constructs pls-sem model
boostrap_pls_model <-
bootstrap_model(
seminr_model = pls_model,
nboot = 100,
seed = 20231
)
## bootstrapped summary
boostrap_pls_model_summary <- summary(boostrap_pls_model, alpha = 0.10)plot(boostrap_pls_model)Table 4.10. Bootstrapped Factor Loadings
DT::datatable(boot_pls_model_summary$bootstrapped_loadings %>% round(3))The bootstrapped factor loadings (Table 4.10) confirm the statistical significance of all indicator loadings, with t-values exceeding 1.96 (p < 0.05) and ranging from 4.043 to 131.076.
The structural modelβs path coefficients were evaluated to test the hypothesized relationships between constructs. Table 4.11 presents the path estimates, including standardized coefficients, t-values, p-values, and confidence intervals.
Table 4.11. Path Estimates from PLS-SEM Analysis
DT::datatable(boot_pls_model_summary$bootstrapped_paths %>% round(3)) Based on the PLS-SEM analysis, Table 4.12 summarizes the results of the hypothesis testing.
Table 4.12. Summary of Hypothesis Testing Results
# Create a data frame with the hypothesis testing results
hypothesis_results <- data.frame(
Hypothesis = c(
"H1a: Optimism (OPT) positively influences Perceived Ease of Use (PEU)",
"H1b: Optimism (OPT) positively influences Perceived Usefulness (PUN)",
"H2a: Innovativeness (INN) positively influences Perceived Ease of Use (PEU)",
"H2b: Innovativeness (INN) positively influences Perceived Usefulness (PUN)",
"H3a: Discomfort (DIS) negatively influences Perceived Ease of Use (PEU)",
"H3b: Discomfort (DIS) negatively influences Perceived Usefulness (PUN)",
"H4a: Performance Risk (PER) negatively influences Perceived Ease of Use (PEU)",
"H4b: Performance Risk (PER) negatively influences Perceived Usefulness (PUN)",
"H5: Perceived Ease of Use (PEU) positively influences Perceived Usefulness (PUN)",
"H6: Perceived Ease of Use (PEU) positively influences Behavioral Intention to Use (BIU)",
"H7: Perceived Usefulness (PUN) positively influences Behavioral Intention to Use (BIU)"
),
Path = c(
"OPT -> PEU",
"OPT -> PUN",
"INN -> PEU",
"INN -> PUN",
"DIS -> PEU",
"DIS -> PUN",
"PER -> PEU",
"PER -> PUN",
"PEU -> PUN",
"PEU -> BIU",
"PUN -> BIU"
),
Coefficient = c(0.299, 0.582, 0.434, -0.123, -0.138, 0.028, 0.072, 0.089, 0.415, 0.321, 0.408),
t_value = c(4.401, 11.877, 6.087, -2.035, -1.765, 0.341, 0.961, 1.187, 6.141, 5.295, 5.994),
CI_lower = c(0.192, 0.495, 0.306, -0.197, -0.279, -0.088, -0.041, -0.037, 0.3, 0.202, 0.308),
CI_upper = c(0.4, 0.654, 0.538, -0.013, -0.002, 0.162, 0.203, 0.21, 0.516, 0.408, 0.519)
)
# Add decision column (whether hypothesis is supported or not)
hypothesis_results <- hypothesis_results %>%
mutate(
Significant = abs(t_value) > 1.96 & (sign(CI_lower) == sign(CI_upper)),
Expected_Sign = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE),
Sign_Match = (Coefficient > 0 & Expected_Sign) | (Coefficient < 0 & !Expected_Sign),
Decision = case_when(
Significant & Sign_Match ~ "Supported",
Significant & !Sign_Match ~ "Supported (opposite direction)",
!Significant ~ "Not supported"
)
)
# Create formatted table with kable
hypothesis_table_kable <- hypothesis_results %>%
select(Hypothesis, Path, Coefficient, t_value, CI_lower, CI_upper, Decision) %>%
rename(
"Path Coefficient" = Coefficient,
"t-value" = t_value,
"95% CI Lower" = CI_lower,
"95% CI Upper" = CI_upper
) %>%
kable(format = "html", caption = "Summary of Hypothesis Testing Results", digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = TRUE) %>%
column_spec(1, width = "40%") %>%
column_spec(7, bold = TRUE)
# Print the kable table
hypothesis_table_kable| Hypothesis | Path | Path Coefficient | t-value | 95% CI Lower | 95% CI Upper | Decision |
|---|---|---|---|---|---|---|
| H1a: Optimism (OPT) positively influences Perceived Ease of Use (PEU) | OPT -> PEU | 0.299 | 4.401 | 0.192 | 0.400 | Supported |
| H1b: Optimism (OPT) positively influences Perceived Usefulness (PUN) | OPT -> PUN | 0.582 | 11.877 | 0.495 | 0.654 | Supported |
| H2a: Innovativeness (INN) positively influences Perceived Ease of Use (PEU) | INN -> PEU | 0.434 | 6.087 | 0.306 | 0.538 | Supported |
| H2b: Innovativeness (INN) positively influences Perceived Usefulness (PUN) | INN -> PUN | -0.123 | -2.035 | -0.197 | -0.013 | Supported (opposite direction) |
| H3a: Discomfort (DIS) negatively influences Perceived Ease of Use (PEU) | DIS -> PEU | -0.138 | -1.765 | -0.279 | -0.002 | Not supported |
| H3b: Discomfort (DIS) negatively influences Perceived Usefulness (PUN) | DIS -> PUN | 0.028 | 0.341 | -0.088 | 0.162 | Not supported |
| H4a: Performance Risk (PER) negatively influences Perceived Ease of Use (PEU) | PER -> PEU | 0.072 | 0.961 | -0.041 | 0.203 | Not supported |
| H4b: Performance Risk (PER) negatively influences Perceived Usefulness (PUN) | PER -> PUN | 0.089 | 1.187 | -0.037 | 0.210 | Not supported |
| H5: Perceived Ease of Use (PEU) positively influences Perceived Usefulness (PUN) | PEU -> PUN | 0.415 | 6.141 | 0.300 | 0.516 | Supported |
| H6: Perceived Ease of Use (PEU) positively influences Behavioral Intention to Use (BIU) | PEU -> BIU | 0.321 | 5.295 | 0.202 | 0.408 | Supported |
| H7: Perceived Usefulness (PUN) positively influences Behavioral Intention to Use (BIU) | PUN -> BIU | 0.408 | 5.994 | 0.308 | 0.519 | Supported |
Of the eleven (11) hypotheses tested, seven (7) were supported by the data, while four (4) were not supported. These are the following:
Significant Paths
Optimism (OPT) to Perceived Ease of Use (PEU)
This significant positive relationship indicates that students with higher levels of technology optimism perceive cryptocurrencies as easier to use.
Optimism (OPT) to Perceived Usefulness (PUN)
This strong positive relationship suggests that optimistic attitudes toward technology substantially enhance perceptions of cryptocurrency usefulness, representing the strongest effect among all paths.
Innovativeness (INN) to Perceived Ease of Use (PEU)
Personal innovativeness has a significant positive effect on perceived ease of use, suggesting that students who are more innovative with technology find cryptocurrencies easier to use.
Innovativeness (INN) to Perceived Usefulness (PUN)
Interestingly, this significant negative relationship indicates that more innovative students perceive cryptocurrencies as less useful, which contradicts typical technology adoption patterns and warrants further investigation.
In other words, higher innovativeness is associated with lower perceived usefulness, which contradicts the original positive direction proposed in the hypothesis.
This unexpected negative relationship suggests that more innovative individuals might actually perceive cryptocurrencies as less useful, perhaps due to higher standards or more critical evaluation of the technologyβs current practical applications.
Perceived Ease of Use (PEU) to Perceived Usefulness (PUN)
This strong positive relationship confirms the Technology Acceptance Modelβs core proposition that technologies perceived as easier to use are also perceived as more useful.
Perceived Ease of Use (PEU) to Behavioral Intention to Use (BIU)
This significant positive relationship demonstrates that perceived ease of use directly influences studentsβ intentions to adopt cryptocurrency.
Perceived Usefulness (PUN) to Behavioral Intention to Use (BIU)
This strong positive relationship indicates that perceived usefulness has a substantial direct effect on cryptocurrency adoption intentions, and this effect is stronger than that of perceived ease of use.
Non-Significant Paths
Discomfort (DIS) to Perceived Ease of Use (PEU)
The confidence interval includes zero, indicating that technology discomfort does not significantly affect how easy students perceive cryptocurrencies to be.
Discomfort (DIS) to Perceived Usefulness (PUN)
Technology discomfort does not significantly influence perceptions of cryptocurrency usefulness.
Perceived Risk (PER) to Perceived Ease of Use (PEU)
Perceived risk has no significant impact on ease of use perceptions.
Performance Risk (PER) to Perceived Usefulness (PUN)
Performance risk concerns do not significantly affect usefulness perceptions.
The results reveal that optimism and innovativeness (positive dimensions of Technology Readiness) are the strongest predictors of perceived ease of use and perceived usefulness of cryptocurrencies. Contrary to expectations, technology innovativeness shows a negative relationship with perceived usefulness, suggesting that more innovative students may be more critical or realistic about cryptocurrencyβs practical value.
The Technology Acceptance Modelβs core relationships are confirmed, with perceived ease of use positively influencing perceived usefulness, and both constructs significantly affecting behavioral intention to use cryptocurrencies. Perceived usefulness demonstrates a stronger effect on behavioral intention (0.408) compared to perceived ease of use (0.322), indicating that practical utility is more important than simplicity in driving cryptocurrency adoption among university students.
Notably, the inhibiting factors of Technology Readiness (discomfort and performance risk) did not significantly influence either perceived ease of use or perceived usefulness, suggesting that concerns about technology complexity or performance may not be major barriers to cryptocurrency adoption in this population.